﻿using System.Collections.Generic;
using HK.Core.Common.Data;

namespace HK.Core.Common.Protocol.Data
{
    /// <summary>
    /// 接口 : Json数据
    /// </summary>
    public interface IJsonData : IDataBase
    {
        /// <summary>
        /// 初始化.
        /// </summary>
        void Init();

        /// <summary>
        /// 重置.
        /// </summary>
        void Reset();
        
        /// <summary>
        /// 应用数据
        /// </summary>
        /// <param name="iData">数据</param>
        /// <param name="iImport">导入标志位(true:从相应的*.json文件导入; false:反之;)</param>
        /// <returns>true:有变更; false:无变更;</returns>
        bool ApplyData(IJsonData iData, bool iImport = false);
        
        /// <summary>
        /// 当前对象的字符串化文字
        /// <para>* Json格式</para>
        /// </summary>
        /// <returns>字符串化文字</returns>
        string ToString();
    }

    /// <summary>
    /// 接口 : Json列表Element
    /// </summary>
    public interface IListElement : IJsonData
    {
        /// <summary>
        /// 唯一标识Element的Key
        /// </summary>
        string Key { get; }
    }

    /// <summary>
    /// 接口 : Json列表数据
    /// </summary>
    /// <typeparam name="TElement">列表Element类型</typeparam>
    public interface IListJsonData<TElement> : IJsonData where TElement : JsonData, IListElement
    {
        /// <summary>
        /// 列表
        /// </summary>
        List<TElement> List { get; }
        
        /// <summary>
        /// 服务器器数
        /// </summary>
        int Count { get; }
        
        /// <summary>
        /// 唯一标志位
        /// <para>* true : 不允许有重复元素出现; false : 反之;</para>
        /// </summary>
        bool Distinct { get; }

        /// <summary>
        /// 追加
        /// </summary>
        /// <param name="iElement">Element</param>
        void AddElement(TElement iElement);

        /// <summary>
        /// 追加
        /// </summary>
        /// <param name="iElements">Element列表</param>
        void AddElements(List<TElement> iElements);

        /// <summary>
        /// 排序
        /// </summary>
        /// <param name="iAscending">true:升序; false:降序;</param>
        void Sort(bool iAscending = true);
    }
}
